package tdam.androide.web;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.content.Context;

public class Servidor {

	private static String ipServidor;
	private static String puertoServidor;
	private static Context contexto;
	private static String solicitud;
	private static Respuesta respuesta;
	private static MenssajeWeb mensajeWeb;
	
	private static final String TAG_USER = "user";
	private static final String TAG_RESULT = "result";
	private static final String TAG_DETAIL = "detail";
	private static final String TAG_MESSAGE = "message";
	
	private static final String ATT_ID = "id";
	private static final String ATT_USERNAME = "username";
	private static final String ATT_TYPE = "type";
	private static final String ATT_CODE = "code";
	private static final String ATT_DESCRIPTION = "description";
	private static final String ATT_TIMESTAMP = "timestamp";
	private static final String ATT_FROM = "from"; 
	
	/**
	*
	*Este metodo hace ...
	*@param ...
	*@return ...
	*@exception ...
	*@throws ...
	*
	*/
	
	public static void enviarSolicitud() {
		try {
			respuesta = null;
			
			URL u = new URL("http://" + ipServidor + ":" + puertoServidor + "/MessageSender/");
	        URLConnection conexion = u.openConnection();

	        conexion.setDoOutput(true);
	        if (conexion instanceof HttpURLConnection) {
	        	((HttpURLConnection) conexion).setRequestMethod("POST");
	        }

	        OutputStreamWriter out = new OutputStreamWriter(conexion.getOutputStream());

	        sendFileData(out);
	        out.close();
	        
	        BufferedReader in = new BufferedReader(new InputStreamReader(conexion.getInputStream()));
	        
	        String s = null;
	        while ((s = in.readLine()) != null) {
	        	System.out.println(s);
	            try {
	            	FileOutputStream archivo = contexto.getApplicationContext().openFileOutput("response.xml", Context.MODE_PRIVATE);
	    			OutputStreamWriter fout = new OutputStreamWriter(archivo);
	    			fout.write(s);
	    			fout.close();
	    		} catch (Exception e) { }
	        }
	        in.close();
	        
	        FileInputStream fil = contexto.getApplicationContext().openFileInput("response.xml");
			crearRespuesta(fil);
		} catch (Exception e) {
			respuesta = null;
		}	
	}

	/**
	*
	*Este metodo hace ...
	*@param ...
	*@return ...
	*@exception ...
	*@throws ...
	*
	*/
	
	private static void sendFileData(OutputStreamWriter out) {
		try {
			FileInputStream fil = contexto.getApplicationContext().openFileInput(solicitud);
			System.out.println(fil);
			BufferedReader in = new BufferedReader(new InputStreamReader(fil));
			String str;
			while ((str = in.readLine()) != null) {
				out.write(str);
				System.out.println(str);
			}
			in.close();
		} catch (IOException e) {
			respuesta = null;
		}
	}
	
	/**
	*
	*Este metodo hace ...
	*@param ...
	*@return ...
	*@exception ...
	*@throws ...
	*
	*/
	
	public static void setSolicitud(Context _contexto, String _solicitud, String _ipServidor, String _puertoServidor) {
		contexto = _contexto;
		solicitud = _solicitud;
		ipServidor = _ipServidor;
		puertoServidor = _puertoServidor;
	}
	
	/**
	*
	*Este metodo hace ...
	*@param ...
	*@return ...
	*@exception ...
	*@throws ...
	*
	*/
	
	public static void anularRespuesta() {
		respuesta = null;
	}
	
	public static Respuesta getRespuesta() {
		return respuesta;
	}
	
	/**
	*
	*Este metodo hace ...
	*@param ...
	*@return ...
	*@exception ...
	*@throws ...
	*
	*/
	
	public static void crearRespuesta(FileInputStream fil) {
		try {
			XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
			factory.setNamespaceAware(true);
			XmlPullParser parser = factory.newPullParser();
			parser.setInput(fil, null);
			respuesta = new Respuesta();
			int parserEvent = parser.getEventType();
			while (parserEvent != XmlPullParser.END_DOCUMENT) {
				switch (parserEvent) {
					case XmlPullParser.START_TAG:
						if (TAG_RESULT.equals(parser.getName())) {
							respuesta.setId(parser.getAttributeValue(null, ATT_ID));
							respuesta.setType(parser.getAttributeValue(null, ATT_TYPE));
						} else if(TAG_USER.equals(parser.getName())) {
							respuesta.setUsername(parser.getAttributeValue(null, ATT_USERNAME));
						} else if(TAG_DETAIL.equals(parser.getName())) {
							respuesta.setCode(Integer.parseInt(parser.getAttributeValue(null, ATT_CODE)));
							respuesta.setDescription(parser.getAttributeValue(null, ATT_DESCRIPTION));
						} else if(TAG_MESSAGE.equals(parser.getName())) {
							mensajeWeb = new MenssajeWeb();
							mensajeWeb.setTimeStamp(parser.getAttributeValue("", ATT_TIMESTAMP));
							mensajeWeb.setUsuario(parser.getAttributeValue("", ATT_FROM));
							try {
								parserEvent = parser.nextToken();
								if (parserEvent == XmlPullParser.CDSECT) {
									mensajeWeb.setMensaje(parser.getText());
									respuesta.addMensaje(mensajeWeb);
								}
							} catch (Exception e) { }
						}
						break;
				}
				parserEvent = parser.next();
			}
		} catch (Exception e) {
			respuesta = null;
		}
	}

}
